import Dep from "../dep/index.js"
import protoArguments from "./arrProto.js"
import defineReactive from "./reactive.js"

export default function Observer(data) {
    Object.defineProperty(data, "__ob__", {
        enumerable: false,
        configurable: true,
        writable: true,
        value: this
    })
    // 对象(数组)嵌套的时候 我们也需要给它一个 dep 也就是reactive响应式拦截中的childOb
    data.__ob__.dep = new Dep()

    if (Array.isArray(data)) {
        // 更改新修改的数组原型
        protoArguments(data)
        // 对数组中的元素进行遍历处理 因为可能会出现[{a:1}, 1, 1] 这种不是基本类型的数据
        this.handleArrElement(data);
    } else {
        this.walk(data)
    }
}
// 对象
Observer.prototype.walk = function (data) {
    for (let key in data) {
        defineReactive(data, key, data[key])
    }
}
// 处理数组中的元素
Observer.prototype.handleArrElement = function(data) {
    for (let element of data) {
        observer(element)
    }
}
export function observer(data) {
    if (typeof data != "object") {
        return
    }
    if(data.__ob__) return data.__ob__
    return new Observer(data)
}